package com.hlkj.warboot.module_laboratory.configurer.util;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Description: Stream
 * @Author: lixing
 * @Date: 2020/6/17 18:02
 */
public class StreamUtil {
    //    Stram是用来处理数组、集合的API，内部处理时并行执行的
//
//    执行流程由源（数组、集合、生成器方法、IO通道） -> 中间操作 -> 终止操作三部分组成
//    一个流可以有一个或多个中间操作，每一个中间操作都会返回一个新的流供下一个操作继续使用
//    一个流只能有一个终止操作，只有遇到终止操作，源才开始执行中间操作
    public static void main(String[] args) {
        Stream<String> arrayStream = Arrays.stream(new String[]{"a", "b", "c", "d"});

        List<String> strList = Arrays.asList("1", "2", "3", "4", "5");
        Stream<String> lsitStream = strList.stream();

        Stream<Integer> intStream = Stream.iterate(0, x -> x + 2); // 创建无限流，从0开始，每次递增2，无限循环下去
        intStream.limit(10).forEach(System.out::println); // 限流，只输出10个元素，否则会无限输出

        Stream<Double> doubleStream = Stream.generate(Math::random); // 创建无限流，随机生产Double，无限循环下去
        doubleStream.limit(10).forEach(System.out::println);


        Arrays.stream(new Integer[]{1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) // 创建Stream【创建源】
                .distinct() // 去重【中间操作】
                .sorted((o1, o2) -> o2 - o1) // 倒序【中间操作】
                .filter(item -> item % 2 == 0) // 过滤出偶数【中间操作】
                .map(item -> item += 1) // 对所有的值自增1【中间操作】
                .forEach(System.out::println); // 输出【终止操作】

        List<Integer> list = Arrays.stream(new Integer[]{1, 2, 3, 4}).collect(Collectors.toList());
        System.out.println(list);
    }
}
